<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Cate extends Model
{
    protected $fillable=['name','is_directory','level','path','thumb'];


    protected static function boot()
    {
        parent::boot();

        //监听category的创建事件，用于初始化path和level的值
        static::creating(function(Cate $category){
            //如果创建的是个根类目
            if(!$category->parent_id){
                //将层级设置成为0
                $category->level=0;
                //将path设为-
                $category->path='-';

            }else{
                //将层级设为父类层级加1
                $category->level=$category->parent->level+1;

                //设定path
                $category->path.=$category->parent->path.$category->parent_id.'-';

            }

        });
    }

    /**
     * 父类
     */
    public function parent()
    {
        //这里不指定键，默认使用的是函数名称_主键，作为关联键
        return $this->belongsTo(Cate::class);
    }

    /**
     * 子类
     */
    public function children()
    {
        return $this->hasMany(Cate::class,'parent_id');
    }


    /**
     * 属于该类的文章
     */
    public function articles()
    {
        return $this->hasMany(Article::class,'cate_id');
    }

    /**
     * 获取所有祖先类目的ID值
     * path_ids 访问器
     * @return array
     */
    public function getPathIdsAttribute()
    {
        return array_filter(explode('-',trim($this->path,'-')));
    }

    /**
     * 访问器，获取所有祖先类目并按层级排序
     */
    public function getAncestorsAttribute()
    {
        return Cate::query()
            ->whereIn('id',$this->path_ids)
            ->orderBy('level')
            ->get();
    }

    /**
     * 访问器，获取以-为分隔的所有祖先类目名称以及当前类的名称
     */
    public function getFullNameAttribute()
    {
        return $this->ancestors //所有的祖先类目
        ->pluck('name') //取出所有祖先类目的name，作为一个数组
        ->push($this->name)//将当前类目的 name 字段值加到数据尾部
        ->implode('/');//用-符号将数组的值组装成一个字串
    }

}
